#============================================================
#	ProxyMove
#============================================================
#  代理移动
#============================================================
# @datetime: 2022-5-11 00:27:18
#============================================================
class_name ProxyMove
extends Node


export (float, -360, 360) var angle_degrees : float = 0.0 setget set_angle_degrees
export var speed_max : float = 150.0


var proxy : Base
var velocity : Vector2 = Vector2(0, 0)


#============================================================
#   Set/Get
#============================================================
func set_angle_degrees(value: float) -> void:
	angle_degrees = value
	velocity = Vector2.LEFT.rotated(deg2rad(angle_degrees)) * velocity.length()


#============================================================
#   内置
#============================================================
func _ready():
	if get_parent() is KinematicBody2D:
		proxy = PKinematicBody2D.new()
	elif get_parent() is Node2D:
		proxy = PNode2D.new()
	elif get_parent() is Control:
		proxy = PControl.new()
	else:
		set_physics_process(false)
		printerr("没有匹配的类型 ", get_script().resource_path)
#		assert(false, "类型不匹配")
		return
	proxy.host = get_parent()
	
	velocity = Vector2.LEFT.rotated(deg2rad(angle_degrees)) * speed_max


func _physics_process(delta):
	move(velocity, delta)


#============================================================
#   自定义
#============================================================
func _is_ProxyMove():
	return true

##  获取节点的代理移动节点
## @host  
## @return  
static func get_proxy_move(host: Node) -> ProxyMove:
	for child in host:
		if child.has_method("_is_ProxyMove"):
			return child
	return null


##  移动
## @velocity  
## @delta  
func move(velocity: Vector2, delta: float):
	
	proxy.move(velocity, delta)


#============================================================
#   内部类
#============================================================
class Base:
	var host : Node
	
	func move(velocity: Vector2, delta: float):
		pass


## Node2D 节点
class PNode2D:
	extends Base
	
	#(override)
	func move(velocity, delta):
		host.position += velocity * delta

## KinematicBody2D 节点
class PKinematicBody2D:
	extends Base
	
	#(override)
	func move(velocity, delta):
		(host as KinematicBody2D).move_and_slide(velocity)

## Control 节点
class PControl:
	extends Base
	
	#(override)
	func move(velocity, delta):
		(host as Control).rect_position += velocity * delta


